#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include "Terminal.hpp"

using namespace std;

void Usage(std::string proc)
{
    std::cout << "\n\rUsage: " << proc << " serverip serverport\n"
              << std::endl;
}

// struct ThreadData
// {
//     struct sockaddr_in server;
//     int sockfd;
//     std::string serverip;
// };

// void *recv_message(void *args)
// {
//     // OpenTerminal();
//     ThreadData *td = static_cast<ThreadData *>(args);
//     char buffer[1024];
//     while (true)
//     {
//         memset(buffer, 0, sizeof(buffer));
//         struct sockaddr_in temp;
//         socklen_t len = sizeof(temp);

//         ssize_t s = recvfrom(td->sockfd, buffer, 1023, 0, (struct sockaddr *)&temp, &len);
//         if (s > 0)
//         {
//             buffer[s] = 0;
//             cerr << buffer << endl;
//         }
//     }
// }

// void *send_message(void *args)
// {
//     ThreadData *td = static_cast<ThreadData *>(args);
//     string message;
//     socklen_t len = sizeof(td->server);

//     std::string welcome = td->serverip;
//     welcome += " comming...";
//     sendto(td->sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&(td->server), len);

//     while (true)
//     {
//         cout << "Please Enter@ ";
//         getline(cin, message);

//         // std::cout << message << std::endl;
//         // 1. 数据 2. 给谁发
//         sendto(td->sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&(td->server), len);
//     }
// }

// 多线程
// ./udpclient serverip serverport
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        Usage(argv[0]);
        exit(0);
    }
    string Ser_ip = argv[1];
    uint16_t Ser_proc = stoi(argv[2]);
    //1.创建struct sockaddr 
    
    struct sockaddr_in Server;
    bzero(&Server,sizeof(Server));

    Server.sin_family=AF_INET;
    Server.sin_port = htons(Ser_proc);
    Server.sin_addr.s_addr= inet_addr(Ser_ip.c_str());

    int _sockeid = socket(AF_INET,SOCK_DGRAM,0);
    if(_sockeid <0)
    {
        cout<<"Client is error "<<endl;
        exit(1);
    }

    char Buffer[1024];
    string message;

    socklen_t len = sizeof(Server);

    while(true)
    {
        cout<<"Please enter :";
        getline(cin,message);
        sendto(_sockeid,message.c_str(),sizeof(message)-1,0,(struct sockaddr*)&Server,len);


        struct sockaddr_in temp;
        socklen_t len = sizeof(temp);

        ssize_t s = recvfrom(_sockeid, Buffer, sizeof(Buffer)-1, 0, (struct sockaddr*)&temp, &len);//接受&
        if(s > 0)
        {
            Buffer[s] = 0;
               cout << Buffer << endl;
        }
    }

    close(_sockeid);
    return 0;
}